package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import play.db.DB;
import models.Unidade;

public class DAOUnidade implements DAO<Unidade> {

	@Override
	public Integer inserir(Unidade u) {
		try {
			Connection conexao = DB.getConnection();
			String sql = "INSERT INTO unidades (nome, abreviatura) VALUES ('?','?')";
			PreparedStatement prep = conexao.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			prep.setString(1, u.nome);
			prep.setString(2, u.abreviatura);
			prep.executeUpdate();
			ResultSet rs = prep.getGeneratedKeys();
			rs.next();
			Integer id = rs.getInt(1);
			rs.close();
			return id;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	@Override
	public void atualizar(Unidade u) {
		try {
			Connection conexao = DB.getConnection();
			String sql = "UPDATE unidades SET (nome=?, abreviatura=?) WHERE id=?";
			PreparedStatement prep = conexao.prepareStatement(sql);
			prep.setString(1, u.nome);
			prep.setString(2, u.abreviatura);
			prep.setInt(3, u.id);
			prep.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		
	}

	@Override
	public void excluir(Integer id) {
		try {
			Connection conexao = DB.getConnection();
			String sql = "DELETE FROM unidades WHERE id=?";
			PreparedStatement prep = conexao.prepareStatement(sql);
			prep.setInt(1, id);
			prep.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		
	}

	@Override
	public List<Unidade> todos() {
		List<Unidade> unidades = new ArrayList<Unidade>();
		try {
			Connection conexao = DB.getConnection();
			String sql = "SELECT * FROM unidades";
			PreparedStatement prep = conexao.prepareStatement(sql);
			ResultSet rs = prep.executeQuery();
			while(rs.next()) {
				unidades.add(geraUnidade(rs));
			}
			
			return unidades;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	@Override
	public Unidade getById(Integer id) {
		try {
			Connection conexao = DB.getConnection();
			String sql = "SELECT * FROM unidades WHERE id=?";
			PreparedStatement prep = conexao.prepareStatement(sql);
			prep.setInt(1, id);
			ResultSet rs = prep.executeQuery();
			if(rs.next()) {
				return geraUnidade(rs);
			} else {
				return null;
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
	private Unidade geraUnidade(ResultSet rs) {
		try {
			Unidade u = new Unidade();
			u.id = rs.getInt(1);
			u.nome = rs.getString(2);
			u.abreviatura = rs.getString(3);
			
			return u;
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
}
